A compiler can produce executable code by compiling source code into code that can be executed by a particular processor. This type of processor-specific code is referred to as “native code”, machine instructions that can be executed by a particular type of processor but not by any type of processor. Another type of compiler can receive source code and produce an intermediate code or virtual machine byte code that is not processor-specific. Intermediate code is typically received by an intermediate language compiler (e.g., a just-in-time (JIT) compiler), and compiled into native code right before the program executes. Intermediate code is not platform-specific.
An interpreter reads source code or intermediate code and executes the code statement by statement without translating the code into native code. Typically, interpreting code is slower than executing native code. Interpreting code is typically slower than JIT-compiling intermediate code into native code and executing the native code.
Implementation of a debugger for interpreted code is typically less complex than implementation of a debugger for native code. However, response time is typically faster for a debugger for native code that for a debugger for interpreted code. A debugger typically provides a user with the ability to control execution of a program by stepping into or out of a function, stepping over a function, pausing and resuming execution, inspecting the current value of a variable or stack location and so on.